
// 导入模块
import { useUserStore } from '@/stores/user'


import Request ,{ type HttpMethod,type HttpRequestConfig } from 'luch-request'



// 实例化网络请求
const service = new Request({
  // 接口基地址
  baseURL: 'https://consult-api.itheima.net',
  custom: {
    loading: true,
  }
})

// 白名单
const whileList = ["/code", "/login", "/login/password"]

//请求拦截器
service.interceptors.request.use(
  (config) => {
    // 显示加载状态
    if (config.custom?.loading) {
      uni.showLoading({ title: '正在加载...', mask: true })
    }
    // 获取token，排除白名单
    const store = useUserStore()
    if(store.token && config.url && !whileList.includes(config.url)){
      config.header={
        ...config.header,
        Authorization: `Bearer ${store.token}`
      }
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 服务端响应数据结构
export interface ServiceResponse<T> {
  code: number
  message: string
  data: T
}

// 响应拦截器
service.interceptors.response.use(
  (res) =>{
        // 隐藏加载状态提示
        uni.hideLoading()

        //统一错误处理
        if(res.data.code !== 10000){
          uni.showToast({
            title: res.data.message,
            icon: 'none'
          })
          return Promise.reject(res.data)
        }
        return res.data
  },
  (error) => {
    // 隐藏加载状态提示
    uni.hideLoading()
    if(error.data.code === 401){
      uni.showToast({
        title: '登录过期，请重新登录',
        icon: 'none'
      })
      // 清除登录状态
      uni.removeStorageSync('token')
      // 跳转登录页
      uni.reLaunch({ url: '/pages/login/index' })
    }
    return Promise.reject(error)
  }
)

// 封装请求工具
const request = <T>(
  url: string, // 请求地址
  method: HttpMethod = 'GET', // 请求方式(可选)
  submitData?: object, // 请求参数(可选)
  config?: HttpRequestConfig // 请求配置(可选)
) => {
  return service.request<T, ServiceResponse<T>>({
    url: url,
    method: method,
    [method.toUpperCase() === 'GET' ? 'params' : 'data']: submitData,
    ...config, // 兜底请求配置，可覆盖前面的配置
  })
}



// 导出配置好的模网络模块
export { service, request }


